/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fi.uba.algo3.tp3.modelo.inanimados;

//import ar.uba.fi.algo3.titiritero.Posicionable;
import fi.uba.algo3.tp3.modelo.actores.Personaje;
import fi.uba.algo3.tp3.modelo.notificaciones.StateNotification;
import fi.uba.algo3.tp3.modelo.servicios.ServicioJuego;
import fi.uba.algo3.tp3.vista.Observador;

/**
 *
 * @author srx
 */
public class Punto implements Comible {

    protected Boolean comido;
    public final static int PUNTOS = 100;
    private ServicioJuego servicio;
    private int posX;
    private int posY;
    private int radio;
    protected int puntosOtorgados = PUNTOS;
    protected Observador observador;

    /** para ser usado con el parser de XML*/
    public Punto(int x, int y) {
        this.posX = x;
        this.posY = y;
        this.comido = Boolean.FALSE;
    }

    public Punto(int x, int y, ServicioJuego servicio) throws IllegalArgumentException {
        if (servicio == null) {
            throw new IllegalArgumentException();
        }
        this.comido = Boolean.FALSE;
        this.servicio = servicio;
        this.posX = x;
        this.posY = y;
    }

    @Override
    public int getX() {
        return this.posX;
    }

    @Override
    public int getY() {
        return this.posY;
    }

    @Override
    public Boolean fueComido() {
        return this.comido;
    }

    @Override
    public void serComido() {
        if (!fueComido()) {
            this.comido = true;
            observador.notificar(StateNotification.MUERTO);
            this.getServicio().aumentarPuntosJugador(puntosOtorgados);
            this.getServicio().decrementarPuntoComible();
        }
    }

    protected ServicioJuego getServicio() {
        return this.servicio;
    }

    public void setPuntosAOtorgar(int puntos) {
        this.puntosOtorgados = puntos;
    }

    @Override
    public void restablecer() {
        comido = false;
        observador.notificar(StateNotification.NORMAL);
    }

    public void setObservador(Observador observer) {
        this.observador = observer;
    }

    public void setServicio(ServicioJuego servicio) {
        this.servicio = servicio;
    }

    @Override
    public boolean hayColision(Personaje p) {
        int xDeP=p.getX()+p.getDistanciaDeColision();
        int yDeP=p.getY()+p.getDistanciaDeColision();
        int x = (int) Math.abs(xDeP - this.getX());
        int y = (int) Math.abs(yDeP - this.getY());
        int min = x < y ? x : y;
        int distancia=Math.abs(x + y - (min >> 1) - (min >> 2) + (min >> 4));
        if((((p.getDistanciaDeColision()+(this.radio))-distancia) > 0) && (!fueComido())) {
            return true;
        }
        return false;
    }

    public void setRadio(int radio) {
        this.radio = radio;
    }


}
